#include<bitsdc++.h>
using namespace std;
const int N=1e3+10;
int T,d[N],h[N],head[N],cnt=0,cnt2=0,n,m,head2[N];
int q[N],l,r,vis[N];
struct node{
	int nex,to;
}e[N*N],e2[N*N];
struct nodee{
	int idx,rank;
}ans[N];
bool cmp(nodee x,nodee y){
	if(x.rank==y.rank) return x.idx<y.idx;
	return x.rank<y.rank;
}
void add(int u,int v){
	e[++cnt].to=v;
	e[cnt].nex=head[u];
	head[u]=cnt;
	d[u]++;
	e2[++cnt2].to=u;
	e2[cnt2].nex=head2[v];
	head2[v]=cnt2;
}
void init(){
	for(int i=0;i<=n;i++){
		h[i]=1; ans[i].idx=i; head[i]=0; head2[i]=0; vis[i]=0; d[i]=0;
	} 
	cnt=0; cnt2=0;
}
void bfs(int root){
	l=1; r=0; q[++r]=root;
	ans[root].rank=1;
	while(l<=r){
		int u=q[l]; l++;
		for(int i=head[u];i;i=e[i].nex){
			int v=e[i].to;
			if(vis[v]) continue;
			q[++r]=v;
			ans[v].rank=ans[u].rank+1;
			vis[v]=1;
		}
		for(int i=head2[u];i;i=e2[i].nex){
			int v=e2[i].to;
			if(vis[v]) continue;
			q[++r]=v;
			ans[v].rank=ans[u].rank-1;
			vis[v]=1;
		}
	}
}
int findroot(){
	int root,maxn=1;	
	l=1; r=0;
	for(int i=1;i<=n;i++){
		if(d[i]==0){
			q[++r]=i;
			root=i;
		}
	}
	while(l<=r){
		int x=q[l]; l++;
		for(int i=head2[x];i;i=e2[i].nex){
			int v=e2[i].to;
			if(h[v]>h[x]+1) continue;
			h[v]=h[x]+1;
			if(h[v]>maxn){
				maxn=h[v]; root=v;
			}
			q[++r]=v;
		}
	} 
	return root;
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		init();
		for(int i=1;i<=m;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			add(a,b);
		}
		int root=findroot();
//		printf("root: %d\n",root);
		bfs(root);
		sort(ans+1,ans+1+n,cmp);
//		for(int i=1;i<=n;i++) printf("%d %d\n",ans[i].idx,ans[i].rank);
		for(int i=1;i<n;i++)
			printf("%d ",ans[i].idx);
		printf("%d\n",ans[n].idx);
	}
	return 0;
}
/*
1
4 1
4 1
*/

